
#include "comm.hpp"

static void getMessage(int fd)
{
    char buffer[SIZE]={0};//读端缓冲区
    while(true)
    {
        //void * memset ( void * ptr, int value, size_t num );
        memset(buffer,'\0',sizeof(buffer));//为了每次接受信息前，清屏处理上此遗留的无效数据

        int rd = read(fd, buffer, sizeof(buffer) - 1);
        if (rd > 0) // 读取到数据
        {
            cout <<"child: " << getpid() <<" | masseage from client:> " << buffer << endl;
        }
        else if (rd == 0) // 读取到文件尾end of file
        {
            cout << "end of the file, quit!" << endl;
            break;
        }
        else
        {
            perror("read"); // error
            break;
        }
    }
}


int main()//server：读取端，用于接受client发送的通信
{
    //1、创建管道文件
    int ret = mkfifo(ipcPath.c_str(), MODE);
    assert(0 == ret);
    (void)ret;
    Log("server:创建管道文件",Debug) << endl;

    //2、正常文件操作：接受通信、显示通信
    //2.1、打开名命管道
    int fd = open(ipcPath.c_str(), O_RDONLY);
    if(fd < 0)
    {
        perror("open");
        exit(2);//处理assert，上述mkfifo也可以用perror检测
    }
    Log("server:打开名命管道",Debug)<< endl;



    // //2.2、进行通信
    // getMessage(fd);

    //2.2、写法二：创建子进程，进行多项读端通信
    int nums=3;//进程数目
    for(int i = 0; i < nums; ++i)
    {
        int id = fork();
        assert(id >= 0);
        if(id == 0)//子进程：执行读取任务
        {
            getMessage(fd);
            exit(1);//子进程结束，退出进程
        }
    }
    for(int i = 0; i < nums; ++i)//父进程：等待子进程结束
    {
        waitpid(-1,nullptr,0);
    }

    //2.3、通信结束，关闭文件
    close(fd);
    Log("server:通信结束，关闭文件",Debug)<< endl;


    //3、删除管道文件
    unlink(ipcPath.c_str());
    Log("server:删除管道文件",Debug)<< endl;


    return 0;
}